;##################################
;命令：
;nasm -f elf64 day5_0vector_0multiply_0basic.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;Value in arr[0] is 5.
;Value in arr[1] is 12.
;Value in arr[2] is 21.
;Value in arr[3] is 32.
;##################################
extern printf

section .data
	msg: db `Value in arr[%d] is %d.\n`, 0
;######################################
	;请注意：
	;这里使用了内存对齐
	;内存对齐会加快任意计算
	align 16
	arr0: dd 1, 2, 3, 4
	align 16
	arr1: dd 5, 6, 7, 8
;######################################
section .text
	global main

main:
	push rbp
	mov rbp, rsp

;#################################################################
	;请注意：
	;向量只可对int类型进行乘法

	;加载int向量
	;Move Aligned Packed Integer Values
	vmovdqa xmm0, [arr0]
	vmovdqa xmm1, [arr1]

	;向量乘法
	;Multiply Packed Integers and Store Low Result
	vpmulld xmm0, xmm0, xmm1
	vmovdqa [arr0], xmm0
;#################################################################

	;打印
	mov ebx, 0
	jmp compare

execute:
	mov rdi, msg
	movsxd rsi, ebx
	movsxd rdx, dword [arr0 + 4 * ebx]
	call printf

	inc ebx

compare:
	cmp ebx, 4
	jl execute

	mov eax, 0
	leave
	ret
